package com.lxk.mall.pms.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.lxk.mall.pms.controller.app.vo.AppProductSpuPageReqVO;
import com.lxk.mall.pms.domain.PmsProductSpu;
import com.lxk.mall.pms.domain.bo.spu.*;
import com.lxk.mall.pms.domain.vo.spu.PmsProductSpuVo;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.springframework.scheduling.annotation.Async;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 商品spuService接口
 *
 * @author Lion Li
 * @date 2024-06-06
 */
public interface IPmsProductSpuService {

    /**
     * 查询商品spu
     *
     * @param id 主键
     * @return 商品spu
     */
    PmsProductSpu queryById(Long id);

    /**
     * 分页查询商品spu列表
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 商品spu分页列表
     */
    TableDataInfo<PmsProductSpuVo> queryPageList(ProductSpuPageReqBO bo, PageQuery pageQuery);

    /**
     * 查询符合条件的商品spu列表
     *
     * @param bo 查询条件
     * @return 商品spu列表
     */
    List<PmsProductSpuVo> queryList(ProductSpuPageReqBO bo);

    /**
     * 查询IdList
     */
    List<PmsProductSpuVo> queryByIdList(List<Long> idList);

    /**
     * 新增商品spu
     *
     * @param bo 商品spu
     * @return 是否新增成功
     */
    Boolean insertByBo(PmsProductSpuBo bo);

    /**
     * 修改商品spu
     *
     * @param bo 商品spu
     * @return 是否修改成功
     */
    Boolean updateByBo(PmsProductSpuBo bo);

    /**
     * 校验并批量删除商品spu信息
     *
     * @param ids     待删除的主键集合
     * @param isValid 是否进行有效性校验
     * @return 是否删除成功
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 获取 SPU 列表标签对应的 Count 数量
     *
     * @return Count 数量
     */
    Map<Integer, Long> getTabsCount(String productType);

    List<PmsProductSpu> getSpuListByStatus(Integer status);

    List<PmsProductSpu> getSpuList(Collection<Long> spuIds);

    /**
     * 获得商品 SPU 分页，提供给用户 App 使用
     *
     * @param pageVO 分页查询
     * @return 商品 SPU 分页
     */
    TableDataInfo<PmsProductSpu> getSpuPage(AppProductSpuPageReqVO pageVO);

    /**
     * 更新商品 SPU 浏览量
     *
     * @param id        商品 SPU 编号
     * @param incrCount 增加的数量
     */
    @Async
    void updateBrowseCount(Long id, int incrCount);

    Long getSpuCountByCategoryId(Long categoryId);

    PmsProductSpu getSpu(Long spuId);

    Long createSpu(ProductSpuSaveReqBO createReqVO);

    /**
     * 更新商品 SPU
     *
     * @param updateReqVO 更新信息
     */
    void updateSpu(ProductSpuSaveReqBO updateReqVO);

    void updateSpuStock(Map<Long, Integer> stockIncrCounts);

    void updateSpuStatus(ProductSpuUpdateStatusReqBO updateReqVO);

    void appendTabQuery(Integer tabType, LambdaQueryWrapper<PmsProductSpu> query);

    void updateBatchSpuStatus(ProductSpuBatchUpdateStatusReqBO updateReqVO);

    List<PmsProductSpuVo> validateSpuList(Set<Long> spuIds);
}
